﻿using Minecraft.Config;
using Minecraft.ServerHall.Client;
using SuperSocket.SocketBase.Config;
using System;
using System.Diagnostics;
using System.Threading;

namespace Minecraft.ServerHall
{
	public class MinecraftServerStart
	{
		public static void Do()
		{
			var appServer = new MinecraftServer();
			ServerConfig serverConfig = new ServerConfig
			{
				Name = $"MinecraftServer({JsonConfig.Value.Name})", //服务器实例的名称;

				//ServerTypeName = "", //所选用的服务器类型在 serverTypes 节点的名字，配置节点 serverTypes 用于定义所有可用的服务器类型，我们将在后面再做详细介绍;
				//ServerType="", //服务器实例的类型的完整名称;
				//Ip = "Any", //服务器监听的ip地址。你可以设置具体的地址，也可以设置为下面的值 Any - 所有的IPv4地址 IPv6Any - 所有的IPv6地址

				Port = JsonConfig.Value.ServerPort, //服务器监听的端口;

				//ListenBacklog = 100, //监听队列的大小;
				//Disabled = false, //服务器实例是否禁用了;
				//StartupOrder=1, //服务器实例启动顺序, bootstrap 将按照此值的顺序来启动多个服务器实例;
				//SendTimeOut = 5, //发送数据超时时间;
				//SendingQueueSize = 5, //发送队列最大长度, 默认值为5;

				LogCommand = false, //是否记录命令执行的记录;(日志)

				//SyncSend = false, //是否启用同步发送模式, 默认值: false;
				//DefaultCulture=

				LogBasicSessionActivity = false, //是否记录session的基本活动，如连接和断开;
				LogAllSocketException = false,

				Mode = SuperSocket.SocketBase.SocketMode.Tcp, //Socket服务器运行的模式, Tcp (默认) 或者 Udp;
				TextEncoding = CommonConfig.DefEncoding.WebName, //文本的默认编码，默认值是 ASCII;

				MaxConnectionNumber = 8000, //可允许连接的最大连接数;
				SendBufferSize = 1024 * 1024 * 2,//发送缓冲区大小;（该字段应该表示服务器发送的最大字节长度）
				ReceiveBufferSize = 1024 * 100, //接收缓冲区大小;(该字段应该表示服务器接收的最大字节数，最大为1024 * 412，不然会启动失败)
				MaxRequestLength = 1024 * 100, // 最大允许的请求长度，默认值为1024;

				DisableSessionSnapshot = true, //是否禁用会话快照, 默认值为 false.

				//ClearIdleSession = true, //是否定时清空空闲会话，默认值是 false;
				//ClearIdleSessionInterval = 120, //清空空闲会话的时间间隔, 默认值是120, 单位为秒;
				//IdleSessionTimeOut = 300, //会话空闲超时时间; 当此会话空闲时间超过此值，同时 clearIdleSession 被配置成true时，此会话将会被关闭; 默认值为300，单位为秒;

				ClearIdleSession = true, //是否定时清空空闲会话，默认值是 false;
				ClearIdleSessionInterval = 120 * 10000, //清空空闲会话的时间间隔, 默认值是120, 单位为秒;
				IdleSessionTimeOut = 300 * 10000, //会话空闲超时时间; 当此会话空闲时间超过此值，同时 clearIdleSession 被配置成true时，此会话将会被关闭; 默认值为300，单位为秒;

				KeepAliveTime = 600, //网络连接正常情况下的keep alive数据的发送间隔, 默认值为 600, 单位为秒;
				KeepAliveInterval = 60, //Keep alive失败之后, keep alive探测包的发送间隔，默认值为 60, 单位为秒;
				Security = "", //Empty, Tls, Ssl3. Socket服务器所采用的传输层加密协议，默认值为空;
			};
			Stopwatch stopwatch = new Stopwatch();
			stopwatch.Start();

			Console.WriteLine("服务器启动中...");
			if (!appServer.Setup(serverConfig))
			{
				Console.WriteLine("Failed to setup!");
				Console.ReadKey();
				return;
			}
			if (!appServer.Start())
			{
				Console.WriteLine("Failed to start!");
				Console.ReadKey();
				return;
			}

			stopwatch.Stop();
			Console.WriteLine($"服务器启动成功，服务器IP端口：{serverConfig.Ip}:{serverConfig.Port}，所花时间为：{stopwatch.Elapsed.TotalSeconds.ToString("0.00")} s");

			if (JsonConfig.Value.IsDebug)
			{
				//ServerStartAterTest.Do();
			}

			if (JsonConfig.Value.IsTest)
			{
				//控制Console的Size改变
				//SystemThreadPoolConsoleSize.Start();
				//启动测试客户端（方便调试）
				ClientStart.Start();
			}

			//测试环境
			if (JsonConfig.Value.IsTest)
			{
				//定时输出在线测试人员信息
				ThreadPool.QueueUserWorkItem(o =>
				{
					var server = o as MinecraftServer;
					while (true)
					{
						Thread.Sleep(1000);
						if ((DateTimeOffset.Now - server.lastCommandTime).TotalSeconds > server.intervalSecond)
						{
							var count = server.SessionCount;
							if (count >= 2)
							{
								server.lastCommandTime = DateTimeOffset.Now;
								server.intervalSecond = server.intervalSecond * 2;
								Console.WriteLine();
								Console.WriteLine($"所有玩家登录信息（{DateTimeOffset.Now.ToStr()}）：");
								var list = server.GetIpUserNameList();
								Console.WriteLine(string.Join(", ", list.ConvertAll(m => string.Join("", m.ipAddr, m.userName))));
							}
						}
					}
				}, appServer);
			}

			//appServer.Stop();

			while (true)
			{
				Console.ReadKey();
			}
		}
	}
}
